#include "propuestas.h"

propuestas::propuestas()
{
    if(!QSqlDatabase::contains("propuestas"))
        QSqlDatabase::addDatabase("QSQLITE","propuestas");

    // Crea la base de datos que hace la funcion de BallotList(BL)
    if(!QFile::exists("propuestas.db")){
        QString cmd("sqlite3 ");
        cmd.append("propuestas").append(".db ");
        cmd.append("'create table propuestas(pos INTEGER PRIMARY KEY ASC,num_prop INT, sub_prop BLOB, desc_prop BLOB,tipo_voto INT,opc1_desc BLOB,opc2_desc BLOB,opc3_desc BLOB,opc4_desc BLOB,opc5_desc BLOB,voted INT);'");
        system(cmd.toAscii().data());
    }
}

propuestas::~propuestas(){}

void propuestas::ing_prop(QStringList *propuesta){
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);

    if(propuesta->at(1)=="")
        prop_model.setFilter(QString("num_prop=").append(propuesta->at(0)));
    else
        prop_model.setFilter(QString("num_prop=").append(propuesta->at(0)).append(" and sub_prop='").append(propuesta->at(1)).append("'"));

    prop_model.select();

    if(prop_model.rowCount()==0){
        prop_model.insertRows(0, 1);
        prop_model.setData(prop_model.index(0, prop_model.fieldIndex("num_prop")), propuesta->at(0));
    }

    //
    //prop_model.setData(prop_model.index(0, prop_model.fieldIndex("sub_prop")), propuesta->at(1));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("desc_prop")), propuesta->at(2));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("tipo_voto")), propuesta->at(3));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("opc1_desc")), propuesta->at(4));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("opc2_desc")), propuesta->at(5));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("opc3_desc")), propuesta->at(6));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("opc4_desc")), propuesta->at(7));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("opc5_desc")), propuesta->at(8));
    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("voted")), "no");
    prop_model.submitAll();
    prop.close();
}

bool propuestas::search_prop(QString num_prop){
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    prop_model.setFilter(QString("num_prop='").append(num_prop).append("'"));
    prop_model.select();

    if(prop_model.rowCount()==0){
        return false;}
    return true;
}

void propuestas::propuesta(QString num_prop, QStringList &propuesta){
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    prop_model.setFilter(QString("num_prop='").append(num_prop).append("'"));
    prop_model.select();

    if(prop_model.rowCount()==0){
        return;}
    propuesta << prop_model.record(0).value("sub_prop").toString();
    propuesta << prop_model.record(0).value("desc_prop").toString();
    propuesta << prop_model.record(0).value("tipo_voto").toString();
    propuesta << prop_model.record(0).value("opc1_desc").toString();
    propuesta << prop_model.record(0).value("opc2_desc").toString();
    propuesta << prop_model.record(0).value("opc3_desc").toString();
    propuesta << prop_model.record(0).value("opc4_desc").toString();
    propuesta << prop_model.record(0).value("opc5_desc").toString();
}

void propuestas::subpropuesta(QString num_prop, QString sub_prop,QStringList &subpropuesta){
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    prop_model.setFilter(QString("num_prop=").append(num_prop).append(" and sub_prop='").append(sub_prop).append("'"));
    prop_model.select();

    subpropuesta << "";
    subpropuesta << prop_model.record(0).value("desc_prop").toString();
    subpropuesta << prop_model.record(0).value("tipo_voto").toString();
    subpropuesta << prop_model.record(0).value("opc1_desc").toString();
    subpropuesta << prop_model.record(0).value("opc2_desc").toString();
    subpropuesta << prop_model.record(0).value("opc3_desc").toString();
    subpropuesta << prop_model.record(0).value("opc4_desc").toString();
    subpropuesta << prop_model.record(0).value("opc5_desc").toString();
}

QStringList propuestas::lista_subpropuestas(QString num_prop){
    QStringList buffer;
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    prop_model.setFilter(QString("num_prop=").append(num_prop));
    prop_model.select();

    QStringList p(prop_model.record().value("sub_prop").toStringList());


    for(int i=0;i<prop_model.rowCount();i++){
        buffer << prop_model.record(i).value("sub_prop").toString();
    }
    return buffer;
}

void propuestas::del_prop(QString desc_prop){
    QString num_prop,sub_prop;
    int num_size,sub_size;

    desc_prop.remove(0,10);

    num_size = desc_prop.indexOf("-");
    sub_size = desc_prop.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_prop.append(desc_prop.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_prop.append(desc_prop.at(j));
            }
            desc_prop.remove(0,num_size+1);
            sub_size = desc_prop.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_prop.append(desc_prop.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    if(!prop.open()){
        return;
    }

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_prop.isEmpty())
        prop_model.setFilter(QString("num_prop= ").append(num_prop));
    else
        prop_model.setFilter(QString("num_prop= ").append(num_prop).append(" and sub_prop='").append(sub_prop).append("'"));
    prop_model.select();

    if(prop_model.rowCount() > 0) {
        prop_model.removeRows(0, prop_model.rowCount());
        prop_model.submitAll();
    }
    return;
}

void propuestas::get_prop(QStringList &propuestas,QString filter){
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    if(!prop.open()){
        return;
    }

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    prop_model.setSort(prop_model.fieldIndex("num_prop"),Qt::AscendingOrder);
    prop_model.setFilter(filter);
    prop_model.select();

    for(int i=0;i<prop_model.rowCount();i++){
        QString buffer("Propuesta ");
        if(prop_model.record(i).value("sub_prop").toString().isEmpty()){
            buffer.append(prop_model.record(i).value("num_prop").toString());
            buffer.append(": ").append(prop_model.record(i).value("desc_prop").toString());
        }
        else{
            buffer.append(prop_model.record(i).value("num_prop").toString());
            buffer.append("-").append(prop_model.record(i).value("sub_prop").toString()).append(": ");
            buffer.append(prop_model.record(i).value("desc_prop").toString());
        }
        propuestas << buffer;
    }
}

void propuestas::div_prop(QString desc_prop,int num_div){
// Manipulacion del string desc_prop para separar el numero de propuesta
    QString letras("abcdefghijklmnopqrstuvwxyz");
    QString num_prop,sub_prop;
    int num_size,sub_size;

    desc_prop.remove(0,10);

    num_size = desc_prop.indexOf("-");
    sub_size = desc_prop.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_prop.append(desc_prop.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_prop.append(desc_prop.at(j));
            }
            desc_prop.remove(0,num_size+1);
            sub_size = desc_prop.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_prop.append(desc_prop.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    if(!prop.open()){
        return;
    }

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_prop.isEmpty())
        prop_model.setFilter(QString("num_prop= ").append(num_prop));
    else
        prop_model.setFilter(QString("num_prop= ").append(num_prop).append(" and sub_prop='").append(sub_prop).append("'"));

    prop_model.select();

    QSqlRecord buffer(prop_model.record(0));
    buffer.remove(prop_model.fieldIndex("pos"));

    prop_model.removeRows(0,1);
    prop_model.submitAll();

    for(int i=0;i<num_div;i++){
        prop_model.insertRow(0);
        prop_model.setRecord(0,buffer);
        if(buffer.value("sub_prop").toString().isEmpty())
            prop_model.setData(prop_model.index(0, prop_model.fieldIndex("sub_prop")),letras.at(i));
        else
            prop_model.setData(prop_model.index(0, prop_model.fieldIndex("sub_prop")),buffer.value("sub_prop").toString().append("-").append(letras.at(i)));
        prop_model.submitAll();
    }
}

bool propuestas::isVoted(QString desc_prop){
// Manipulacion del string desc_prop para separar el numero de propuesta
    QString num_prop,sub_prop;
    int num_size,sub_size;

    desc_prop.remove(0,10);

    num_size = desc_prop.indexOf("-");
    sub_size = desc_prop.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_prop.append(desc_prop.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_prop.append(desc_prop.at(j));
            }
            desc_prop.remove(0,num_size+1);
            sub_size = desc_prop.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_prop.append(desc_prop.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_prop.isEmpty())
        prop_model.setFilter(QString("num_prop= ").append(num_prop));
    else
        prop_model.setFilter(QString("num_prop= ").append(num_prop).append(" and sub_prop='").append(sub_prop).append("'"));
    prop_model.select();

    if(prop_model.record(0).value("voted").toString()=="no"){
        return false;}
    else if(prop_model.record(0).value("voted").toString()=="si"){
        return true;}
}

bool propuestas::isVoted(QString num_prop, QString sub_prop){
// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);

    if(sub_prop.isEmpty())
        prop_model.setFilter(QString("num_prop= ").append(num_prop));
    else
        prop_model.setFilter(QString("num_prop= ").append(num_prop).append(" and sub_prop='").append(sub_prop).append("'"));
    prop_model.select();

    if(prop_model.record(0).value("voted").toString()=="no"){
        return false;}
    else if(prop_model.record(0).value("voted").toString()=="si"){
        return true;}
}

void propuestas::set_Voted(QString desc_prop){
// Manipulacion del string desc_prop para separar el numero de propuesta
    QString num_prop,sub_prop;
    int num_size,sub_size;

    desc_prop.remove(0,10);

    num_size = desc_prop.indexOf("-");
    sub_size = desc_prop.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_prop.append(desc_prop.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_prop.append(desc_prop.at(j));
            }
            desc_prop.remove(0,num_size+1);
            sub_size = desc_prop.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_prop.append(desc_prop.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase prop = QSqlDatabase::database("propuestas",false);
    prop.setDatabaseName("propuestas.db");
    prop.open();

// Crea el modelo
    QSqlTableModel prop_model(0,prop);
    prop_model.setTable("propuestas");
    prop_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_prop.isEmpty())
        prop_model.setFilter(QString("num_prop= ").append(num_prop));
    else
        prop_model.setFilter(QString("num_prop= ").append(num_prop).append(" and sub_prop='").append(sub_prop).append("'"));
    prop_model.select();

    prop_model.setData(prop_model.index(0, prop_model.fieldIndex("voted")), "si");
    prop_model.submitAll();
}
